#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int get(int s, int j)
{
	return (s >> j) & 1;
}

int set(int s, int j, int v)
{
	return v == 0 ? (s & (~(1 << j))) : (s | (1 << j));
}

long long cal(int n, int m, int i, int j, int s, vector<vector<vector<long long> > > &dp)
{
	if (i == n) {
		return 1;
	}

	if (j == m) {
		return cal(n, m, i + 1, 0, s, dp);
	}

	if (dp[i][j][s] != -1) {
		return dp[i][j][s];
	}

	long long ans = 0;
	if (get(s, j) == 1) {
		ans = cal(n, m, i, j + 1, set(s, j, 0), dp);
	} else {
		if (i + 1 < n) {
			ans = cal(n, m, i, j + 1, set(s, j, 1), dp);
		}
		if (j + 1 < m && get(s, j + 1) == 0) {
			ans += cal(n, m, i, j + 2, s, dp);
		}
	}
	return dp[i][j][s] = ans;
}

long long cal_dp(int n, int m)
{
	vector<vector<long long> > dp(m + 1, vector<long long>((1 << m), 0));
	fill(dp[m].begin(), dp[m].end(), 1);

	long long ans = 0;
	for(int i = n - 1; i >= 0; i--){
		for(int j = m - 1; j >= 0; j--){
			for(int s = 0; s < (1 << m); s++){
				ans = 0;
				if(get(s, j) == 1){
					ans = dp[j + 1][set(s, j, 0)];
				}else{
					if(i + 1 < n){
						ans = dp[j + 1][set(s, j, 1)];
					}
					if(j + 1 < m && get(s, j + 1) == 0){
						ans += dp[j + 2][s];
					}
				}
				dp[j][s] = ans;
			}
		}
		ans = dp[0][0];
		dp[0].swap(dp[m]);
	}
	return ans;
}

int main()
{
	int n, m;
	for (;;) {
		cin >> n >> m;
		if (n == 0 && m == 0) {
			return 0;
		}
		//vector<vector<vector<long long> > > dp(n, vector<vector<long long> >(m, vector<long long>(1 << m, -1)));
		//cout << cal(n, m, 0, 0, 0, dp) << endl;
		cout << cal_dp(n, m)<<endl;
	}
	return 0;
}